package com.prp.keywords_search_statistic;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import com.prp.db.po.SubjectRecommendation;

/**
 * 1. 获取关键字。 2. 使用char* buf[] ,buf_size按情况而定一般最长为20*sizeof(char)，
 * 缓冲个数按实际情况而定。一般不应超过key_lib表中的引用个数。 3. 将关键依次在buf中对照，可以使用strcmp的方法完成。
 * 4.如果命中，则立刻在该关键字对应主题类（子类，实体）的用户搜索热度上权值加1。
 * 5.如果不命中，则做出适当的判断，如果字符串显示表现出“传”“记”“论”等关键字， 则直接将“书名\电影名”写到引用表中，
 * 如果字符串无法显示表示出所属类别，则暂时保留到etckey文件中，供管理员分类添加。 6. 如果buf已满，则采用相应的替换策略。
 * 缓存替换算法采用LRU或FIFO的替换策略，读不命中时，将关键字写入引用表。
 */
public class SearchThread extends Thread {
	private Cache cache = null;
	private String keyword = null;
	private Set<Integer> entityIdSet = null;
	private Integer userID = null;// 搜索该关键字的用户
	private Integer start;
	private Integer count;
	private List<SubjectRecommendation> resultList;
	private ResultProcessor processor;
	final Long FILE_MARK = 2309234234L;

	public SearchThread(Cache cache, String keyword, ResultProcessor processor,
			Integer userID, Integer start, Integer count) {
		this.cache = cache;
		this.keyword = keyword;
		this.processor = processor;
		this.userID = userID;
		if(count >= 0 ){
			this.count = count;
		}else{
			count = 10;
		}
		if(start >= 0){
			this.start = start;
		}else{
			start = 0;
		}
	}

	@Override
	public void run() {
		// 1. 找到该关键字，给该关键字搜索热度+1
		find();

		// 2. 提取用户需要的resultList,从Start位置开始
		resultList = DatabaseProxy.getSubjectPosts(keyword, start, count);

		// 3. 回调client端的函数
		processor.process(keyword, entityIdSet, resultList);
	}

	/**
	 * 4.如果命中，则立刻在该关键字对应主题类（子类，实体）的用户搜索热度上权值加1。
	 * 5.如果不命中，则暂时保留到etckey文件中，供管理员分类添加。
	 * userID是指搜索该关键字的用户
	 */
	private void find() {
		entityIdSet = cache.search(keyword);
		if (entityIdSet == null || entityIdSet.size() == 0) {
			
			// 如果字符串无法显示表示出所属类别，则暂时保留到etckey文件中，供管理员分类添加。
			DatabaseProxy.insertEtcKeyword(keyword);
		} else {
			
			// 如果命中，则立刻在该关键字对应主题类（子类，实体）的用户搜索热度上权值加1。
			Iterator<Integer> iter = entityIdSet.iterator();
			for ( ; iter.hasNext(); ) {
				DatabaseProxy.increaseHit(userID, iter.next());
			}
		}
	}

	/**
	 * 得到cache的命中率
	 * @return
	 */
	public long getHint() {
		return cache.getCacheHints();
	}
}
